/**
 * @author suoyue_zhan
 * @date 2021/01/27 11:57
 * @descript
 */
public class IntegerCatch {

    //基本数据类型的最值
    private static void bestValue(){
        //Integer的最值
        int iMax = Integer.MAX_VALUE;
        int iMin = Integer.MIN_VALUE;
        //数据溢出：不会抛异常，也无提示
        int k = iMax+iMax;
        System.out.println("Integer.MAX_VALUE: "+iMax+"\tInteger.MIN_VALUE: "+iMin);
        System.out.println("Integer.MAX_VALUE+Integer.MAX_VALUE: "+k);

        //Long的最值
        System.out.println("Long.MAX_VALUE = " + Long.MAX_VALUE);
        System.out.println("Long.MIN_VALUE = " + Long.MIN_VALUE);

        //Float和Double的最小值非负数
        System.out.println("Float.MAX_VALUE = " + Float.MAX_VALUE);
        System.out.println("Float.MIN_VALUE = " + Float.MIN_VALUE);
        System.out.println("Float.MIN_NORMAL = " + Float.MIN_NORMAL);
        System.out.println("Double.MAX_VALUE = " + Double.MAX_VALUE);
        System.out.println("Double.MIN_VALUE = " + Double.MIN_VALUE);
    }

    //自动装拆箱－Integer的缓存
    private static void integerCatch(){
        //基本数据类型
        int num1 = 128;         //自动拆箱－反编译后为：Integer num1 ＝ Integer.valueOf(128);
        int num2 = 128;
        System.out.println("int 128 == int 128: "+(num1==num2));
        //包装类型－ Integer中的缓存机制：-128~127
        Integer num3 = 127;     //自动装箱－反编译后为：int num3 = integer.intValue();
        Integer num4 = 127;
        System.out.println("Integer 127 == Integer 127: "+(num3==num4));
        Integer num5 = 128;
        Integer num6 = 128;
        System.out.println("Integer 128 == Integer 128: "+(num5==num6));
        System.out.println("int 128 == Integer 128: "+(num2==num6));
    }

    /**
     * 三目运算符 condition? 表达式 1 : 表达式 2 中，注意表达式 1 和 2 在类型对齐时，可能抛出因自动拆箱导致的 NPE 异常
     * 说明：以下两种场景会触发类型对齐的拆箱操作：
     * 1） 表达式 1 或表达式 2 的值只要有一个是原始类型。
     * 2） 表达式 1 或表达式 2 的值的类型不一致，会强制拆箱升级成表示范围更大的那个类型。
     */
    private static void ternaryOperator(){
        Integer a = 1;
        Integer b = 2;
        Integer c = null;
        Boolean flag = false;
        // a*b 的结果是 int 类型，那么 c 会强制拆箱成 int 类型，抛出 NPE 异常
        Integer result = (flag? a*b : c);
        System.out.println("result: "+result);
    }


    public static void main(String[] args) {
        bestValue();
        System.out.println("------------------------------");
        integerCatch();
        System.out.println("------------------------------");
        ternaryOperator();
    }

}
